﻿using System;
using System.Linq;
using Scommesse.Utility;

namespace Scommesse.Model
{
    public enum StatoScommessaConfermata
    {
        [StringValue("Vinta")]
        Vinta,
        [StringValue("Persa")]
        Persa,
        [StringValue("In Attesa")]
        InAttesa
    }

    [Serializable]
    public class ScommessaConfermata : Scommessa
    {
        public ScommessaConfermata(Carrello carrello)
            : base(carrello)
        {
            DataOra = DateTime.Now;
            Stato = StatoScommessaConfermata.InAttesa;
        }

        public DateTime DataOra { get; private set; }
        public StatoScommessaConfermata Stato { get; set; }

        public override bool Controllabile()
        {
            // Se tutti gli eventi legati alla scommessa sono terminati, allora puoi controllare i risultati
            return Puntate.All(quota => quota.GetEvento().Stato.Equals(StatoEvento.Terminato)) && Stato.Equals(StatoScommessaConfermata.InAttesa);
        }

        public override void ControllaScommessa(ScommessaController controller)
        {
            // Se la scommessa non si trova nello stato "In Attesa" è già stata controllata, quindi esci con errore
            if (!Controllabile())
                throw new Exception("la scommessa è già stata esaminata o c'è stato qualche errore con gli eventi");
            // Considera la scommessa vinta fino a prova contraria
            Stato = StatoScommessaConfermata.Vinta;
            // Se si è sbagliato anche solo un risultato, considera la scommessa persa
            // (se l'evento relativo alla puntata non contiene il risultato puntato)
            foreach (Quota quota in Puntate)
                if (!quota.GetEvento().Risultati.Contains(quota.Valore))
                    Stato = StatoScommessaConfermata.Persa;
        }
    }
}